

*******************************************************************************
*                               Replication code for                          *
*      Finnegan, Jared and Jonas Meckling. 2026. "Fighting the Future:        *
*      Short-Term Investors and Business Opposition to Climate Policy".       *
*      British Journal of Political Science.                                  *
*******************************************************************************
          
* unless otherwise noted, all analyses are based on 'Replication data file.dta'
		  
**************************** Main Paper ***************************************


*** Figure 1. Party positions on climate change policy

//load 'US party positions.dta'

graph twoway (line pro_position year if parfam==30 & tin(1992,2020)) (line pro_position year if parfam==60 & tin(1992,2020)), legend( label (1 "Democrats") label (2 "Republicans") position(6)) ytitle("Pro-climate policy position") xtitle("Year") xline(2012)


*** Figure 2. Climate policy opposition across sectors

graph hbar (mean) opp if giving_firm == 1 & energy_intensive==1, over(NAICS4dig, sort(1) descending) nofill ytitle("Opposition to climate change policy")


*** Table 1. Summary statistics for ownership

** Giving firms
summ opp listed block invest_man passive payout i.size if giving_firm == 1 & energy_intensive==1

** Non-giving firms
summ opp listed block invest_man passive payout i.size if giving_firm == 0 & energy_intensive==1

** Full sample
summ opp listed block invest_man passive payout i.size if energy_intensive==1


*** Figure 3. Covariate balance plot

// Generate weights for public listing using entropy balancing
ebalance listed i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, targets(2) keep(balancetable1_1)

// Save weights with new name
rename _webal _webal_1_1

// load 'balancetable1_1.dta'

encode Xname, gen(xname)

twoway (scatter xname sdiff_Pre , msymbol(th) mcolor(black)) ///
       (scatter xname sdiff_Post , msymbol(oh) mcolor(black)), ///
       xline(0) xtitle("Standardized difference between group of interest and comparison group") ///
	   ylabel(none) ytitle("Covariates") legend(label(1 "Before entropy balancing") ///
	   label(2 "After entropy balancing"))

	   
*** Table 2. Corporate ownership and opposition to climate policy – entropy balancing models 

** Model 1: Publicly listed

//OLS with entropy balancing weights
reg opp listed [pw=_webal_1_1], cluster(bvdid_en)

** Model 2: Blockholding

// Generate weights for blockholding using entropy balancing
ebalance block i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, targets(2) keep(balancetable2_1)

// Save weights with new name
rename _webal _webal_2_1

//OLS with entropy balancing weights
reg opp block [pw=_webal_2_1], cluster(bvdid_en)

** Model 2: Blockholding X public listing
reg opp i.block##i.listed [pw=_webal_2_1], cluster(bvdid_en)
	

*** Figure 4: Marginal effects of blockholding for private and public firms with 95% CIs

reg opp i.block##i.listed [pw=_webal_2_1], cluster(bvdid_en)
margins, dydx(block) at(listed=(0(1)1)) post
coefplot, xline(0) title("") xtitle("Marginal effects of blockholding on climate policy opposition") coeflabels(1._at = "Privately owned" 2._at = "Publicly listed")


*** Table 3: Type of owner and business opposition to climate policy

** Model 1: Active investor ownership
reg opp invest_man i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, vce(cl bvdid_en)

** Model 2: Passive investor ownership
reg opp passive i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, vce(cl bvdid_en)


*** Table 4: Corporate time horizons and opposition to climate policy

** Model 1: Shareholder payout
reg opp payout i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, vce(cl bvdid_en)



**************************Supplementary Information*****************************


*** Table A1: Validating our measure

** Model 1
reg coalition opp if energy_intensive==1, cluster(bvdid_en)

** Model 2
reg coalition opp i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, cluster(bvdid_en)

** Model 3
reg lobby_amount opp if energy_intensive==1, cluster(bvdid_en)

** Model 4
reg lobby_amount opp i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, cluster(bvdid_en)

** Model 5
reg opp coalition if energy_intensive==1, cluster(bvdid_en)

** Model 6
reg opp coalition i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, cluster(bvdid_en)

** Model 7
reg opp lobby_amount if energy_intensive==1, cluster(bvdid_en)

** Model 8
reg opp lobby_amount i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, cluster(bvdid_en)


*** Figure A1. Covariate balance plot for blockholding

//load 'balancetable2_1.dta'

encode Xname, gen(xname)

twoway (scatter xname sdiff_Pre , msymbol(th) mcolor(black)) ///
       (scatter xname sdiff_Post , msymbol(oh) mcolor(black)), ///
       xline(0) xtitle("Standardized difference between group of interest and comparison group") ///
	   ylabel(none) ytitle("Covariates") legend(label(1 "Before entropy balancing") ///
	   label(2 "After entropy balancing"))


*** Table A3:Analyzing additional measures of firms' climate policy position

** Model 1
reg coalition listed [pw=_webal_1_1], cluster(bvdid_en)

** Model 2
reg coalition block [pw=_webal_2_1], cluster(bvdid_en)

** Model 3
reg coalition invest_man i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, vce(cl bvdid_en)

** Model 4
reg coalition passive i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, vce(cl bvdid_en)

** Model 5
reg coalition payout i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, vce(cl bvdid_en)

** Model 6
reg lobby_amount listed [pw=_webal_1_1], cluster(bvdid_en)

** Model 7
reg lobby_amount block [pw=_webal_2_1], cluster(bvdid_en)

** Model 8
reg lobby_amount invest_man i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, vce(cl bvdid_en)

** Model 9
reg lobby_amount passive i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, vce(cl bvdid_en)

** Model 10
reg lobby_amount payout i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, vce(cl bvdid_en)


*** Table A4: Additional controls

** Model 1
reg opp listed i.size i.state##i.year i.NAICS4dig##i.year [pw=_webal_1_1], cluster(bvdid_en)

** Model 2
reg opp listed total_give i.size i.state##i.year i.NAICS6dig##i.year [pw=_webal_1_1], cluster(bvdid_en)

** Model 3
reg opp block i.size i.state##i.year i.NAICS4dig##i.year [pw=_webal_2_1], cluster(bvdid_en)

** Model 4
reg opp block total_give i.size i.state##i.year i.NAICS6dig##i.year [pw=_webal_2_1], cluster(bvdid_en)

** Model 5
reg opp invest_man total_give i.size i.state##i.year i.NAICS6dig##i.year if energy_intensive==1, vce(cl bvdid_en)

** Model 6
reg opp passive total_give i.size i.state##i.year i.NAICS6dig##i.year if energy_intensive==1, vce(cl bvdid_en)

** Model 7
reg opp payout total_give i.size i.state##i.year i.NAICS6dig##i.year if energy_intensive==1, vce(cl bvdid_en)


*** Table A5: Alternative specification

** Model 1
reg opp listed i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, cluster(bvdid_en)

** Model 2
reg opp block i.size i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, cluster(bvdid_en)


*** Table A6: Expanded sample

** Model 1

// Generate weights using entropy balancing (This can take time becuase of the large sample)
ebalance listed i.size i.state##i.year i.NAICS4dig##i.year, targets(2)

//// Save weights with new name
rename _webal _webal_1_2

//OLS with entropy balancing weights
reg opp listed [pw=_webal_1_2], cluster(bvdid_en)

** Model 2

// Generate weights using entropy balancing
ebalance block i.size i.state##i.year i.NAICS4dig##i.year, targets(2) tolerance(0.55)

// Save weights with new name
rename _webal _webal_2_2

//OLS with entropy balancing weights
reg opp block [pw=_webal_2_2], cluster(bvdid_en)

** Model 3
reg opp invest_man i.size i.state##i.year i.NAICS4dig##i.year, vce(cl bvdid_en)

** Model 4
reg opp passive i.size i.state##i.year i.NAICS4dig##i.year, vce(cl bvdid_en)

** Model 5
reg opp payout i.size i.state##i.year i.NAICS4dig##i.year, vce(cl bvdid_en)


*** Table A7: Analyzing fossil fuel versus non-fossil fuel sectors

** Model 1 

// Generate weights using entropy balancing
ebalance listed i.size i.state##i.year i.NAICS4dig##i.year if ff_sector==1 & energy_intensive==1, targets(2)

// Save weights with new name
rename _webal _webal_1_3

//OLS with entropy balancing weights
reg opp listed [pw=_webal_1_3], cluster(bvdid_en)

** Model 2

// Generate weights using entropy balancing
ebalance block i.size i.state##i.year i.NAICS4dig##i.year if ff_sector==1 & energy_intensive==1, targets(2)

// Save weights with new name
rename _webal _webal_2_3

//OLS with entropy balancing weights
reg opp block [pw=_webal_2_3], cluster(bvdid_en)

** Model 3 
reg opp invest_man i.size i.state##i.year i.NAICS4dig##i.year if ff_sector==1 & energy_intensive==1, vce(cl bvdid_en)

** Model 4 
reg opp passive i.size i.state##i.year i.NAICS4dig##i.year if ff_sector==1 & energy_intensive==1, vce(cl bvdid_en)

** Model 5 
reg opp payout i.size i.state##i.year i.NAICS4dig##i.year if ff_sector==1 & energy_intensive==1, vce(cl bvdid_en)

** Model 6

// Generate weights using entropy balancing
ebalance listed i.size i.state##i.year i.NAICS4dig##i.year if ff_sector==0 & energy_intensive==1, targets(2)

// Save weights with new name
rename _webal _webal_1_4

//OLS with entropy balancing weights
reg opp listed [pw=_webal_1_4], cluster(bvdid_en)

** Model 7 

// Generate weights using entropy balancing
ebalance block i.size i.state##i.year i.NAICS4dig##i.year if ff_sector==0 & energy_intensive==1, targets(2)

// Save weights with new name
rename _webal _webal_2_4

//OLS with entropy balancing weights
reg opp block [pw=_webal_2_4], cluster(bvdid_en)

** Model 8 
reg opp invest_man i.size i.state##i.year i.NAICS4dig##i.year if ff_sector==0 & energy_intensive==1, vce(cl bvdid_en)

** Model 9 
reg opp passive i.size i.state##i.year i.NAICS4dig##i.year if ff_sector==0 & energy_intensive==1, vce(cl bvdid_en)

** Model 10 
reg opp payout i.size i.state##i.year i.NAICS4dig##i.year if ff_sector==0 & energy_intensive==1, vce(cl bvdid_en)


*** A5: Sensitivity analysis

** Table A8: Sensitivity analysis

* Publicly listed
sensemakr opp listed size_lrg_vlrg i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, treat(listed) benchmark(size_lrg_vlrg)

* Blockholding
sensemakr opp block size_lrg_vlrg i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, treat(block) benchmark (size_lrg_vlrg)

* Active investment ownership
sensemakr opp invest_man size_lrg_vlrg i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, treat(invest_man) benchmark (size_lrg_vlrg)

* Passive investor ownership
sensemakr opp passive size_lrg_vlrg i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, treat(passive) benchmark (size_lrg_vlrg)

* Shareholder payout
sensemakr opp payout size_lrg_vlrg i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, treat(payout) benchmark (size_lrg_vlrg)

** Figure A2. Contour plots

* Public listing
sensemakr opp listed size_lrg_vlrg total_give i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, treat(listed) benchmark(size_lrg_vlrg total_give)  kd(5)contourplot 

* Blockholding
sensemakr opp block size_lrg_vlrg total_give i.state##i.year i.NAICS4dig##i.year if energy_intensive, treat(block) benchmark (size_lrg_vlrg total_give) kd(1 2) contourplot

* Active investment ownership
sensemakr opp invest_man size_lrg_vlrg total_give i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, treat(invest_man) benchmark (size_lrg_vlrg total_give) kd(1 2) contourplot

* Passive investment ownership
sensemakr opp passive size_lrg_vlrg total_give i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, treat(passive) benchmark (size_lrg_vlrg total_give) kd(1 2) contourplot

* Shareholder payouts
sensemakr opp payout size_lrg_vlrg total_give i.state##i.year i.NAICS4dig##i.year if energy_intensive==1, treat(payout) benchmark (size_lrg_vlrg total_give) kd(1 2) contourplot

